import store from '@/store'
import { getMenus } from '@/api/login'
import { resetRouter } from '@/router'

// 处理后端返回的 `component` 路径，拼装实现懒加载
function loadView(path) {
    return () => import(`@/views/${path}`);
}

// 递归处理每一项 `component` 中的路径
export function dynamicRouters(views) {
    return dynamicRoutersAndParentId(views,null)
}
function dynamicRoutersAndParentId(views,parentId) {
    //过滤掉没有路径的，没有路径的无意义
    views = views.filter(view =>{
        return  view.path;
    })
    views.forEach(view =>{
        //有组件的才是vue 路由
        if (view.component) {
            view.componentPath=view.component
            view.component = loadView(view.component)
            if (!view.meta){
                view.meta={}
            }
            //把需要的放到meta中，方便之后在路由中使用
            view.meta.parentId=parentId
            view.meta.id=view.id   // tag中寻找父级标签使用
            view.meta.title=view.name
            view.meta.icon=view.icon  //菜单中使用
            if (view.meta.isShow == null){
                view.meta.isShow=view.meta.isShow=true  //菜单中使用，默认展示菜单
            }
        }
        if (view.children) {
            view.children =  dynamicRoutersAndParentId(view.children,view.id)
        }
    })
    return views
}

// 添加动态路由，`{ path: '*', redirect: '/404' }` 防止页面刷新，静态路由丢失问题
// next({ ...to, replace: true }) 动态路由 addRoutes 完毕后才放行，防止刷新时 NProgress 进度条加载2次
export function genRoutesAndMenus() {
    return new Promise((resolve, reject)=>{
        store.dispatch('genMenus').then(menus =>{
            //根目录，所有的后台动态路由都挂到这下面，因为后台所有的其实都是Layout下的一个嵌套路由，这个格式与后台路由格式一致
            let rootRouterStr = {
                "id": 0,
                "name": "主目录",
                "parentId": null,
                "path": "/",
                "redirect": "/home",
                "component": "layout/index",
                "meta": {},
                "icon": null
            }
            rootRouterStr.children= menus;
            let rootRouterStrs =[]
            rootRouterStrs.push(rootRouterStr)
            let routers = dynamicRouters(rootRouterStrs);

            resolve(routers[0])
        }).catch(( error) => {
            console.log("发生了异常",error)
            reject(error)
        })
    })

}